#include "TestAI.h"
#include "globalne.h"
sektor::sektor():ktora(NULL)
{}
sektor::~sektor()
{}
bool sektor::dodajDoJakiejsBazy()
{
	if (ktora)
		return false;
	LOGUJ ("Dodaje sektor nr "<<pozycja<<endl);
	int poz=pozycja;
	int mOdl=0;
	int poo=0;
	while(G->M->sek[poo].ktora==NULL)
	{
		for (int i=0; i<64; i++)
		{
			LOGUJ ("Sprawdzam sektor nr "<<G->M->sek[i].pozycja<<endl);
			if (G->M->sek[i].ktora)
			{
				LOGUJ ("Ten sektor nalezy do jakiejs bazy. Odleglosc od naszego to: "<<sektOdl(poz, i)<<endl);
				if (sektOdl(poz, i)<mOdl)
				{
					LOGUJ ("Dobrze, bierzemy! "<<endl);
					mOdl=sektOdl(poz, i);
					poo=i;
				}
			}
		}
		LOGUJ ("Wybralem sektor nr " <<poo<<endl);
		++mOdl;
	}
	LOGUJ ("Dodaje sektor "<<poz<<" do bazy " <<G->M->sek[poo].ktora->nazwa<<endl);
	G->M->sek[poo].ktora->dodajSektor(poz);
	return true;
}
baza * sektor::najblizszaBaza()
{
	if (ktora)
		return ktora;
	LOGUJ ("Szukam bazy najblizszej sektorowi nr "<<pozycja<<endl);
	int poz=pozycja;
	int mOdl=0;
	int poo=0;
	while(G->M->sek[poo].ktora==NULL)
	{
		for (int i=0; i<64; i++)
		{
			//LOGUJ ("Sprawdzam sektor nr "<<G->M->sek[i].pozycja<<endl);
			if (G->M->sek[i].ktora)
			{
				//LOGUJ ("Ten sektor nalezy do jakiejs bazy. Odleglosc od naszego to: "<<sektOdl(poz, i)<<endl);
				if (sektOdl(poz, i)<mOdl)
				{
					//LOGUJ ("Dobrze, bierzemy! "<<endl);
					mOdl=sektOdl(poz, i);
					poo=i;
				}
			}
		}
		//LOGUJ ("Wybralem sektor nr " <<poo<<endl);
		++mOdl;
	}
	//LOGUJ ("Dodaje sektor "<<poz<<" do bazy " <<G->M->sek[poo].ktora->nazwa<<endl);
	//G->M->sek[poo].ktora->dodajSektor(poz);
	return G->M->sek[poo].ktora;
}
int sektor::najDawnoWidziany()
{
	long min=-1;//((G->M->sek[30].ostatnioSprawdzany)+1);
	vector<int> wybrane;
	LOGUJ ("Szukam najdawniej nie ogladanego sektora"<<endl/*<<"Sprawdzam sektor"*/);
	for (int i=0; i<64; i++)
	{
		//LOGUJ (i<<endl);
		if (G->M->sek[i].ktora!=NULL||(G->M->posz))
		{

			continue;
		}
		else if (min>G->M->sek[i].ostatnioSprawdzany||min==-1)
		{
			//LOGUJ ("Czyszcze wektor i dodaje sektor "<<i<<endl);
			wybrane.empty();
			wybrane.push_back(i);
			min=G->M->sek[i].ostatnioSprawdzany;
		}
		else if (min==G->M->sek[i].ostatnioSprawdzany)
		{
			//LOGUJ ("Dodaje sektor "<<i<<endl);
			wybrane.push_back(i);
		}
	}
	/*LOGUJ (endl<<"Sektory wytypowane:");
	for (int i=0; i<wybrane.size(); i++)
		LOGUJ (wybrane[i]<<", ");*/
	if (!wybrane.size())
	{
		LOGUJ ("Nie znalazlem zadnych sektorow, ktore trzeba by sprawdzic."<<endl);
		return -1;
	}


	random_shuffle(wybrane.begin(),wybrane.end());
	LOGUJ (endl<<"Jest to "<<wybrane[0]<<endl);
	return wybrane[0];
}

float3 sektor::punktWSektorze(int tryb)  

{
	LOGUJ (endl<<CZASz<<cb->GetCurrentFrame()<<"\tTu funkcja p.w.s. Sektor: "<< pozycja <<endl);
	float3 ret;
	ret.x=(cb->GetMapWidth())*(pozycja%8);
	ret.z=(cb->GetMapHeight())*(pozycja/8);
	ret.y=cb->GetElevation(ret.x,ret.z);
	LOGUJ ("Lewy, gorny rog sektora to: " <<ret);
	if (tryb==1) // zeby byl srodek sektora, a nie lewy gorny rog
	{
		ret.x+=(cb->GetMapWidth()/2);
		ret.z+=(cb->GetMapHeight()/2);
	}
	else if (tryb==2) // losowy punkt w sektorze
	{
		/*float r=(((float)(((int)rand())%101))/100);
		LOGUJ ("R="<<r<<endl);*/
		ret.x+=(((float)cb->GetMapWidth())*(((float)(((int)rand())%101))/100));
		ret.z+=(((float)cb->GetMapHeight())*(((float)(((int)rand())%101))/100));
	}
	LOGUJ ("\t\tZwracam"<<endl<<"\t\t\tx="<<ret.x<<endl<<"\t\t\ty="<<ret.y<<endl<<"\t\t\tz="<<ret.z<<endl);
	return ret;
}
int sektor::sektOdl(int aktSekt,int docSekt) 
{
    int xs=0;
    int zs=0;
        for (int u=0;u<8;u++) 
		{
            aktSekt-=8;
            if (aktSekt>=0) {zs++;}
            else break;
        }
    xs=aktSekt+8;
    int xt=0;
    int zt=0;    
        for (int u=0;u<8;u++) 
		{
            docSekt-=8;
            if (docSekt>=0) {zt++;}
            else break;
        }
    xt=docSekt+8;   
    return abs(xs-xt)+abs(zs-zt);
}